package org.suanfaTranning.ST200_Chatpter1_LineTable_HashTable_String.array;

/**
 * @Auther: qingle
 * @Date: 2024/9/4-22:25
 * @Description:
 * 给出一个32 位的有符号整数，将这个整数每位上的数字进行反转
 * 输入：123
 * 输出：321
 * 输入：-123
 * 输出：-321 // 符号不变
 * 输入：120
 * 输出：21 // 首位非0；数值溢出返回0；
 * @version: 1.0
 */
public class ArrayDemo {

	/**
	 * 思路：1.字符串逆序函数  reverse()
	 * 1.1 如果不记得函数，对字符串进行双指针调换O(n)/2,需要字符串转数组 Char[] char = string.toCharArray();
	 *
	 * 字符串转数组，时间复杂度O(n)
	 * 字符串首尾交换，时间复杂度O(n),空间复杂度O(1)
	 * 数组，读取的时间复杂度O(1),空间复杂度O(1)
	 *
	 * 1.2 暴力解法，逆序输出，时间复杂度O(n),需要字符串转数组
	 *
	 * 字符串转数组，时间复杂度O(n)
	 * 字符串遍历，时间复杂度O(n)
	 * 一个字符串，空间复杂度O(n)
	 *
	 * 2.符号处理，特殊情况处理：符号和数字分开
	 * int sign = x > 0 ? 1 : -1; // 符号
	 * x = x < 0 ? -x : x; // 去掉负号
	 *
	 *
	 * 3.021这种直接转为数字
	 * 4.数组溢出边界，则返回0
	 * boolean isOverflow = false;
	 * int result = value > Integer.MAX_VALUE || value < Integer.MIN_VALUE;
	 *
	 * 4.【最优解思路】
	 * 边界问题：
	 *
	 *
	 *
	 *
	 */
	public static int reverse(int x) {
		long result = 0; // 使用long类型防止溢出
		int MAX = Integer.MAX_VALUE;
		int MIN = Integer.MIN_VALUE;

		while (x != 0) {
			int pop = x % 10;
			x /= 10;

			// 检查是否会导致正数溢出
			// 如果result已经大于MAX / 10，或者result等于MAX / 10且pop大于7，则乘以10后加上pop会超出正数最大值
			if ((result > MAX / 10) || (result == MAX / 10 && pop > 7)) return 0;

			// 检查是否会导致负数溢出
			// 如果result已经小于MIN / 10，或者result等于MIN / 10且pop小于-8，则乘以10后加上pop会低于负数最小值
			if ((result < MIN / 10) || (result == MIN / 10 && pop < -8)) return 0;

			result = result * 10 + pop;
		}

		return (int) result;
	}

	public static void main(String[] args) {
		System.out.println(reverse(123));   // 输出: 321
		System.out.println(reverse(-123));  // 输出: -321
		System.out.println(reverse(1534236469)); // 输出: 0 (溢出)
	}

}
